Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Поиск по базе товаров с учетом морфологии (Андрей Фрoлов)
Author Message
Андрей Фрoлов
Участник форума



Joined: 10 Dec 2004
Posts: 27
Карма: 2
   поощрить/наказать

Location: Набережные Челны

PostPosted: Fri Sep 09, 2005 2:53 pm (написано за 32 секунды)
   Post subject: Поиск по базе товаров с учетом морфологии
Reply with quote

Господа, у кого есть опыт создания поиска с учетом морфологии по базе товаров (более
100000 записей). Каждое наименование товара - в среднем 4-5 слов. Плюс 3-4 параметра.
В MySQL запись выглядит примерно так:
Code (any language): скопировать код в буфер обмена
par1|par2|par3|описание_товара
Поиск происходит так же - выбираются нужные параметры и вводится запрос из неск.
слов.

Я решил сделать так:
сначала индексируем базу и получаем таблицу
Code (any language): скопировать код в буфер обмена
par1par2par3|базовая_форма_слова1|все_id_товаров_с_этим_словом
par1par2par3|базовая_форма_слова2|все_id_товаров_с_этим_словом
par1par2par3|базовая_форма_слова3|все_id_товаров_с_этим_словом
..
т.е. при поиске конкатенируем параметры из запроса, находим базовую форму каждого
слова из запроса, из таблицы с индексом получаем списки id товаров для каждого слова
и соответствующей комбинации параметров, выделяем из них общие id и с помощью IN()
выводим нужные записи.

Недостатки:
- нельзя искать по части слова
- нельзя заранее сортировать списки
- индексация тяжелая по времени
- чем больше слов в запросе, тем больше времени тратится на выделение общих id из списков
..

Может есть лучшее решение??
Back to top
View user's profile Send private message
Алексей Пешков
Участник форума



Joined: 16 Jun 2004
Posts: 76
Карма: 2
   поощрить/наказать

Location: Москва

PostPosted: Tue Sep 13, 2005 12:32 am (спустя 3 дня 9 часов 38 минут)
   Post subject:
Reply with quote

xml.yandex.ru/
Back to top
View user's profile Send private message Send e-mail
Андрей Фрoлов
Участник форума



Joined: 10 Dec 2004
Posts: 27
Карма: 2
   поощрить/наказать

Location: Набережные Челны

PostPosted: Wed Sep 14, 2005 3:41 pm (спустя 1 день 15 часов 9 минут; написано за 49 секунд)
   Post subject:
Reply with quote

при чем тут яндекс??
прочтите, пожалуйста, вопрос.
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Thu Sep 15, 2005 12:31 pm (спустя 20 часов 49 минут; написано за 40 секунд)
   Post subject:
Reply with quote

Андрей Фрoлов wrote:
Плюс 3-4 параметра.
Каких параметра?
Андрей Фрoлов wrote:
par1par2par3|базовая_форма_слова1|все_id_товаров_с_этим_словом
par1par2par3|базовая_форма_слова2|все_id_товаров_с_этим_словом
par1par2par3|базовая_форма_слова3|все_id_товаров_с_этим_словом
Жуть какая!
Андрей Фрoлов wrote:
Может есть лучшее решение??
Конечно есть. Только я задачу еще не понял.
Back to top
View user's profile Send private message
Андрей Фрoлов
Участник форума



Joined: 10 Dec 2004
Posts: 27
Карма: 2
   поощрить/наказать

Location: Набережные Челны

PostPosted: Thu Sep 15, 2005 12:57 pm (спустя 25 минут; написано за 1 минуту 2 секунды)
   Post subject:
Reply with quote

Quote:
Каких параметра?
числовых, не больше 3-х значного числа
Quote:
Жуть какая!
вот и я о том же, но лучше пока ничего нет :(
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Thu Sep 15, 2005 2:54 pm (спустя 1 час 57 минут; написано за 22 минуты 46 секунд)
   Post subject:
Reply with quote

Допустим, товары выглядят как-то так (таблица items):

[item_id|item_name|item_description|width|height] (width, height - Ваши additional_params)

Допустим, есть таблица индексов, которая выглядит как-то так (таблица baseforms):

[baseform|item_id|weight] (weight - кол-во слов в итеме, типа вес для ранжирования)

Задача 1: найти товары по словам проще пареной репы (запросы не проверяю - лень):
Code (SQL): скопировать код в буфер обмена
SELECT item_id
FROM baseforms
WHERE baseform='test'
  OR baseform='other_test'
ORDER BY num_words
DESC
Усложняем задачу (задача 2): надо учитывать еще и парам1, парам2, парам3, парам-парам-па-пам...

решение 1:

Получить данные из задачи 1 и последовательно просмотреть, удовлетворяют ли итем_иды условиям по таблице с товарами.
Этот супергипермегаметод сработает всегда, но его недостаток заключается в его супергипермегамедлительности.

решение 2:

Написать супергипермегазапрос к базе данных, чтобы она сама парилась о производительности...

[offtop]
(в этом месте мне надо отойти по нужде, заварить себе чаю, а то он кончился, позвонить своему провайдеру и сказать, что они все козлы и ни хрена не умеют, а также проверить пару сайтов, а то я сейчас переносом занимаюсь... хостер собирается с нового года прекратить предоставлять виртуальные сервера - переношу все на физический сервер... ну там, пока DNS обновятся)
[/offtop]

[offtop]
Прошло хрен, знает сколько времени, даже про чай забыл..
[/offtop]

... в результате родился супергипермегазапрос:
Code (SQL): скопировать код в буфер обмена
SELECT baseforms.baseform AS request_word, items.item_id AS item
FROM baseforms
LEFT JOIN items ON baseforms.item_id=items.item_id AND (items.width=40 OR items.height=86)
WHERE (baseforms.baseform='test' OR baseforms.baseform='other_word')
AND items.item_id IS NOT NULL
ORDER BY baseform.weight DESC
Ну вот собственно и все.
Есть еще вопросы?
Back to top
View user's profile Send private message
alexhemp
Участник форума



Joined: 31 Aug 2005
Posts: 29
Карма: 2
   поощрить/наказать


PostPosted: Thu Sep 15, 2005 3:35 pm (спустя 41 минуту; написано за 28 секунд)
   Post subject:
Reply with quote

Андрей Фрoлов

Если база выводится на сайт, то используйте внешние индексаторы, например mnogoSearch или aspseek.
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Thu Sep 15, 2005 5:43 pm (спустя 2 часа 7 минут; написано за 51 секунду)
   Post subject:
Reply with quote

alexhemp wrote:
например mnogoSearch
У меня mnogosearch не всегда успешно собирался.
alexhemp wrote:
aspseek
Слишком мощно для одного маленького сайта, пусть и с дофигищем записей, ИМХО...
Back to top
View user's profile Send private message
Андрей Фрoлов
Участник форума



Joined: 10 Dec 2004
Posts: 27
Карма: 2
   поощрить/наказать

Location: Набережные Челны

PostPosted: Sat Sep 17, 2005 1:46 pm (спустя 1 день 20 часов 3 минуты; написано за 2 минуты 33 секунды)
   Post subject:
Reply with quote

Константин Жинько [tIT] wrote:
... в результате родился супергипермегазапрос:
SELECT baseforms.baseform AS request_word, items.item_id AS item
FROM baseforms
LEFT JOIN items ON baseforms.item_id=items.item_id AND (items.width=40 OR items.height=86)
WHERE (baseforms.baseform='test' OR baseforms.baseform='other_word')
AND items.item_id IS NOT NULL
ORDER BY baseform.weight DESC
Спасибо, попробую смоделировать Ваш вариант, потом скажу о результатах.
Константин Жинько [tIT] wrote:
[offtop]
(в этом месте мне надо отойти по нужде, заварить себе чаю, а то он кончился, позвонить своему провайдеру и сказать, что они все козлы и ни хрена не умеют, а также проверить пару сайтов, а то я сейчас переносом занимаюсь... хостер собирается с нового года прекратить предоставлять виртуальные сервера - переношу все на физический сервер... ну там, пока DNS обновятся)
[/offtop]
если не секрет, скажите у кого виртуальный сервер арендовали и к кому хотите переехать
Просто на следующей неделе придется тоже арендовывать либо вирт., либо выдел., а насчет хостера уверенности нет.
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Sun Sep 18, 2005 10:12 am (спустя 20 часов 26 минут; написано за 2 минуты 6 секунд)
   Post subject:
Reply with quote

Как успехи?
Кстати, я бы не индексировал предлоги, союзы и пр. хренотень, - просто вырезал бы их из запроса, и все слова из запроса приводил бы к базовой словоформе.
Андрей Фрoлов wrote:
скажите у кого виртуальный сервер арендовали и к кому хотите переехать
И то и другое -- hoster.ru
Back to top
View user's profile Send private message
Андрей Фрoлов
Участник форума



Joined: 10 Dec 2004
Posts: 27
Карма: 2
   поощрить/наказать

Location: Набережные Челны

PostPosted: Sun Oct 16, 2005 4:55 pm (спустя 28 дней 6 часов 42 минуты; написано за 17 секунд)
   Post subject:
Reply with quote

Извиняюсь, что долго не был..

Да, этот вариант лучше, чем мой.
Индексация в 2 раза быстрее, во столько же меньше кода :)

На запросах из одного слова выигрывает процентов 20,
а вот далее, при увеличении количества слов уже начинает
проигрывать и отрабатывать запрос значительно медленнее.
Тем медленнее, чем больше слов в запросе. Но, учитывая, что
большинство запросов однословные, то в итоге должны выиграть чем проиграть.
Только в этом случае обязательно использование индексов, иначе запрос выполняется в несколько раз дольше.
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Mon Oct 17, 2005 11:08 am (спустя 18 часов 13 минут; написано за 41 секунду)
   Post subject:
Reply with quote

+1 за тягу к экспериментам *))
Андрей Фрoлов wrote:
Только в этом случае обязательно использование индексов
Разумеется *)
Back to top
View user's profile Send private message
Андрей Фрoлов
Участник форума



Joined: 10 Dec 2004
Posts: 27
Карма: 2
   поощрить/наказать

Location: Набережные Челны

PostPosted: Mon Oct 17, 2005 6:44 pm (спустя 7 часов 35 минут; написано за 32 секунды)
   Post subject:
Reply with quote

пасиб, стараемся

я так понимаю, это педагогический ход с Вашей стороны :)
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Tue Oct 18, 2005 9:52 am (спустя 15 часов 7 минут; написано за 32 секунды)
   Post subject:
Reply with quote

Андрей Фрoлов
Да нет... Нужно было просто с join'ами поэкспериментировать, а самому себе задачу лень было ставить *)
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Apr 17, 2006 2:30 pm (спустя 5 месяцев 30 дней 4 часа 38 минут)
   Post subject:
Reply with quote


М

Перенесено из форума: Разное :: PHP.
Перенесено в форум: Общие вопросы :: SQL.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML